package com.zyp.shop.controller;


import com.zyp.shop.entity.User;
import com.zyp.shop.service.UserService;
import com.zyp.shop.util.JwtUtil;
import com.zyp.shop.vo.LoginVo;
import com.zyp.shop.vo.Result;
import com.zyp.shop.vo.UserVo;
import io.swagger.annotations.*;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by Intellij IDEA
 *
 * @author 赵雅璞
 * @Date: 2022/11/17 18:04
 * @Version 1.0
 */
@RestController
@RequestMapping("user")
@Api(tags = "有关于用户信息方向的操作")

// 解决跨域的注解
/*@CrossOrigin
        // origins 允许那些域来请求  比如本地 localhost IP地址(192.168.31.158)等等
        (origins = {"*"},
        // 允许携带那些请求头的请求跨域 这个 了解一下 请求头 不屑的话默认 *
        allowedHeaders = {"*"}
        // 允许那些请求方式跨域 不写的话默认就是 *
        ,methods = {RequestMethod.GET,RequestMethod.DELETE,RequestMethod.POST,RequestMethod.PUT}
        // 是否需要携带凭证
        ,allowCredentials = "true") 使用了 全局跨域配置类*/
public class UserController {
    @Resource(name = "userService")
    private UserService userService;

    @GetMapping("selectAll")
    @ApiOperation(value = "用户登录接口方法")
    public Result selectAll(){
        List<User> users = userService.selectAll();
        if (users!=null){
            return new Result(2000,"所有的用户",users);
        }
        return new Result(5000,"为查询到用户",0);
    }
    /**
     *  用户登录
     * @param loginVo 用户的账号密码信息
     * @return 返回账户 并且将此账户存入session中
     */
    @PostMapping("login")
    @ApiOperation(value = "用户登录接口方法")
    // @ApiImplicitParam 单个参数的描述
    // 多个参数的api描述同样的 里面是个数组 一个个单参的描述注解
    @ApiImplicitParams({@ApiImplicitParam(value = "用户的账号密码"),})
    public Result loginByEmailAndPassword(@RequestBody LoginVo loginVo){
        User user = userService.selectByEmailAndPassword(loginVo.getEmail(), loginVo.getPassword());
        // token需要的数据 也是自定义内容 想要什么就添什么
        Map<String, Object> map = new HashMap<>();
        if(user!=null){
            map.put("email",user.getUEmail());
            // 返回加密后的 token码  我们也可一在后端解析 token码
            return new Result(2000,"登录成功",JwtUtil.createToken(map));
        }return new Result(5000,"登录失败","暂无数据");
    }

    /**
     *  注册账号
     * @param user 封装好的 注册账号的对象信息
     * @return 返回是否注册成功
     */
    @PostMapping("insert")
    @ApiOperation(value = "用户注册账号方法")
    public Result insertUser(@RequestBody User user){
        if (userService.insert(user)>0){
            return new Result(2000,"注册成功","咩呀");
        }return new Result(5000,"注册失败","可能用户重复");
    }

    /**
     * 用户端修改信息接口方法
     * @param user 被修改的信息
     * @return 返回修改是否成功
     */
    @PutMapping("update")
    @ApiOperation(value = "用户修改信息")
    public Result updateUser(@RequestBody User user) {
        System.out.println(user);
        if(userService.update(user) > 0) return new Result(2000,"修改信息成功");
        else return new Result(5000,"修改信息失败");
    }

    /**
     *  删除用户的接口方法
     * @param id 被删删除的用户的编号id
     * @return 返回是否被删除
     */
    @DeleteMapping("delete")
    @ApiOperation(value = "删除用户方法")
    @ApiImplicitParam(value = "用户id")
    public Result deleteUserById(Integer id) {
        int i = userService.deleteById(id);
        if (i > 0) return new Result(2000,"删除成功",i);
        else return new Result(5000,"删除失败",i);
    }
}
